'''
    什么是查询参数？
    http://127.0.0.1:8000/get?name=xxx&age=18

    http://127.0.0.1:8000/get?age=18&name=xxx

    在 url 的 ? 后面跟着的一组或多组键值对，就是查询参数


    FastAPI 的查询参数
    当声明了不属于路径参数以外的其他函数参数时， FastAPI 会自动解析为查询参数
    和路径参数不同，查询参数可以是可选非必填的，也可以具有默认值

'''
from enum import Enum

from fastapi import FastAPI
import uvicorn
from typing import Optional, List, Tuple, Dict

app = FastAPI()


# 路径参数 + 请求参数
# @app.get('/items/{items_id}')
# async def read_item(item_id: str, name: str):
#     return {"item_id": item_id, "name": name}

# 路径参数+请求参数
@app.get("/items/{item_id}")
async def read_item(item_id: str, name: Optional[str] = None):
    return {"item_id": item_id, "name": name}


# 必传参数+可选参数的栗子

@app.get("/items2")
async def read_item(item_id: str, name: Optional[str] = None):
    return {"item_id": item_id, "name": name}


# 查询参数类型自动转换
@app.get("/items3/{item_id}")
async def read_item(item_id: str, q: Optional[str] = None, short: bool =False):
    item = {"item_id": item_id}
    if q:
        item.update({"q": q})
    if not short:
            # 如果 short == False，则加多一个键 description
        item.update({"description": "This is an amazing item that has a long description"})

    return item


# 指定枚举类型请求参数的栗子
class ModelName(Enum):
    boy = '男'
    girl = '女'
    unknow = "未知"

@app.get('/items4')
async def read_item(name: str, sex: Optional[ModelName] = ModelName.unknow):
    return {
        "name": name,
        "sex": sex
    }


# 查询参数为列表 List[str]
@app.get('/List')
async def read_item(address: List[str] = None):
    return {"address": address}

'''

    http://127.0.0.1:8000/List?address=["sb","tm"]
    http://127.0.0.1:8000/List?address=sb&address=tm
    
    这2种请求都不会传值成功!!!!，返回的都是   {"address": null}
    
    需要借助 Query 库



'''

if __name__ == '__main__':
    uvicorn.run(app='main:app', host='127.0.0.1', port=8000, reload=True, debug=True)

